/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package desarrollosoft.ghce.dao.implementaciones;

import desarrollosoft.ghce.dao.interfaces.IUnidadMedidaDAO;
import desarrollosoft.ghce.entidades.UnidadMedida;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author ariel
 */
@Repository("unidadMedidaDAO")
public class UnidadMedidaDAO implements IUnidadMedidaDAO {

    @PersistenceContext
    private EntityManager entityManager;
    
    @Override
    public List<UnidadMedida> obtenerTodasUnidadMedida() {
        Query consulta = entityManager.createQuery(
                "SELECT u FROM UnidadMedida u ORDER BY u.nombreAbreviado ASC"
        );
        return consulta.getResultList();
    }

    @Override
    public List<UnidadMedida> obtenerTodasUnidadMedidaPorNombreCompleto() {
        Query consulta = entityManager.createQuery(
                "SELECT u FROM UnidadMedida u ORDER BY u.nombreCompleto ASC"
        );
        return consulta.getResultList();
    }

    @Override
    public List<UnidadMedida> obtenerTodasUnidadMedidaPorNombreCompleto(String nombreCompleto) {
        Query consulta = entityManager.createQuery(
                "SELECT u FROM UnidadMedida u WHERE u.nombreCompleto LIKE CONCAT('%',:nombreCompleto,'%') "
                        + "ORDER BY u.nombreCompleto ASC"
        );
        consulta.setParameter("nombreCompleto", nombreCompleto);
        return consulta.getResultList();
    }

    @Override
    @Transactional(propagation = Propagation.MANDATORY)
    public void eliminarUnidadMedida(UnidadMedida unidadMedida) {
        entityManager.remove( entityManager.merge(unidadMedida) );
    }

    @Override
    @Transactional(propagation = Propagation.MANDATORY)
    public void modificarUnidadMedida(UnidadMedida unidadMedida) {
        entityManager.merge(unidadMedida);
    }

    @Override
    @Transactional(propagation = Propagation.MANDATORY)
    public void crearUnidadMedida(UnidadMedida unidadMedida) {
        entityManager.persist(unidadMedida);
    }

    @Override
    public boolean existeUnidadMedidaConNombreCompleto(String nombreCompletoMayusculas) {
        Query consulta = entityManager.createQuery(
                "SELECT u FROM UnidadMedida u WHERE UPPER(u.nombreCompleto) = :nombreCompletoMayusculas "
        );
        consulta.setParameter("nombreCompletoMayusculas", nombreCompletoMayusculas);
        List<UnidadMedida> lista = consulta.getResultList();
        if (lista.isEmpty()) {
            return false;
        }
        return true;
    }

    @Override
    public boolean existeUnidadMedidaConNombreAbreviado(String nombreAbreviadoMayusculas) {
        Query consulta = entityManager.createQuery(
                "SELECT u FROM UnidadMedida u WHERE UPPER(u.nombreAbreviado) = :nombreAbreviadoMayusculas "
        );
        consulta.setParameter("nombreAbreviadoMayusculas", nombreAbreviadoMayusculas);
        List<UnidadMedida> lista = consulta.getResultList();
        if (lista.isEmpty()) {
            return false;
        }
        return true;
    }

    @Override
    public boolean existeUnidadMedidaConNombreCompletoYdistintoId(Long id, String nombreCompletoMayusculas) {
        Query consulta = entityManager.createQuery(
                "SELECT u FROM UnidadMedida u WHERE UPPER(u.nombreCompleto) = :nombreCompletoMayusculas "
                        + "AND u.id != :id"
        );
        consulta.setParameter("nombreCompletoMayusculas", nombreCompletoMayusculas);
        consulta.setParameter("id", id);
        List<UnidadMedida> lista = consulta.getResultList();
        if (lista.isEmpty()) {
            return false;
        }
        return true;
    }

    @Override
    public boolean existeUnidadMedidaConNombreAbreviadoYdistintoId(Long id, String nombreAbreviadoMayusculas) {
        Query consulta = entityManager.createQuery(
                "SELECT u FROM UnidadMedida u WHERE UPPER(u.nombreAbreviado) = :nombreAbreviadoMayusculas "
                        + "AND u.id != :id"
        );
        consulta.setParameter("nombreAbreviadoMayusculas", nombreAbreviadoMayusculas);
        consulta.setParameter("id", id);
        List<UnidadMedida> lista = consulta.getResultList();
        if (lista.isEmpty()) {
            return false;
        }
        return true;
    }
    
}
